home *** CD-ROM | disk | FTP | other *** search
- /* Copy n bytes from the source-file to a dest-file
- **
- ** Rudolph Riedel <rudolph-riedel@t-online.de>
- **
- ** V1.0 02-07-05
- **
- ** This is public-domain, do whatever you like with this code.
- **
- **
- */
-
- #include <clib/exec_protos.h>
- #include <clib/dos_protos.h>
- #include <clib/alib_stdio_protos.h>
-
-
- UBYTE VerstrA[]="$VER: CopyHead 1.0 (02-07-05) R.Riedel";
-
- int main(void)
- {
- struct RDArgs *rda;
- LONG vec[3], length=1000, buffersize, readlength, status, i=0, filesize;
- BPTR fIn,fOut;
- UBYTE *Globuff;
- struct FileInfoBlock *fib;
-
- vec[0]=vec[1]=0;
- vec[2]=(LONG)&length;
- buffersize=readlength=32000;
-
- if((rda = ReadArgs("Source/A,Dest/A,Length/N",vec,NULL)) != NULL)
- {
- length = *(const LONG *) vec[2];
-
- if(fIn=Lock((STRPTR)vec[0], ACCESS_READ))
- {
- if(fib=AllocMem(sizeof(struct FileInfoBlock),MEMF_PUBLIC))
- {
- if(Examine(fIn,fib))
- {
- filesize=fib->fib_Size;
- UnLock(fIn);
- if(filesize < length) length=filesize;
- if(length < buffersize) readlength=length;
- filesize=0;
- if(fIn=Open((STRPTR)vec[0],MODE_OLDFILE))
- {
- if(fOut=Open((STRPTR)vec[1],MODE_NEWFILE))
- {
- if(Globuff=(UBYTE *)AllocMem(buffersize,MEMF_PUBLIC|MEMF_CLEAR))
- {
- status=1;
- while(status>0&&(i=Read(fIn,Globuff,readlength))>0)
- {
- status=Write(fOut,Globuff,i);
- if(status!=i)
- {
- status=(-1);
- }
- filesize+=i;
- if(filesize == length) status=0;
- if((filesize+buffersize)>length) readlength=length-filesize;
- }
- Close(fOut);
- if(status==-1||i==-1)
- {
- Fault(IoErr(),NULL,Globuff,FAULT_MAX);
- Printf(Globuff,0);
- DeleteFile((STRPTR)vec[1]);
- }
- FreeMem(Globuff,buffersize);
- }
- }
- Close(fIn);
- }
- }
- FreeMem(fib,sizeof(struct FileInfoBlock));
- }
- }
- FreeArgs(rda);
- }
- return 1;
- }
-